home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
EnigmA Amiga Run 1997 February
/
EnigmA AMIGA RUN 15 (1997)(G.R. Edizioni)(IT)[!][issue 1997-02][PLANET CD V].iso
/
enigma
/
earcd
/
comm
/
comm5
/
nwsbrkr5.lha
/
Reader
/
NewsBreaker
/
src
/
Globals.h
< prev
next >
Wrap
C/C++ Source or Header
|
1996-12-15
|
34KB
|
1,084 lines
/*
globals.h -- Globale Variablen
*/
/* Programmname und EMail-Adresse des Autors. Ich habe diese Namen über
Defines eingebaut, damit man schnell die Soft für andere Projekte
leichter recyclen kann. Der Name und andere Daten sind schnell und problemlos
ausgetauscht. */
#define NB_NAME "NewsBreaker"
#define NB_AUTHOR_NAME "Stefan Müller"
#define NB_AUTHOR_EMAIL "sm@mk2.maus.sauerland.de"
/* von ARexx Script erzeugte Defines:
NB_DATE -- aktuelles Compile-Datum
NB_TIME -- aktuelle Zeit
*/
#include <Define.h>
/*
Version besteht aus: Release/Revision/Compilerlauf
NB_REL -- Release x, die "Auflage" der Applikation
NB_REV -- die x.te Revision (Überarbeitung) einer Release
NB_COMP -- der x. Compilerlauf in einer Release (Compilerscript: >>Define.h)
NB_STATUS -- Entwicklungsstatus: alpha/beta/gamma/final ...
*/
#define NB_REL "0"
#define NB_REV "5"
/* NB_COMP wird durch Compilerscript hochgezählt, erzeugt, eingebunden */
#define NB_STATUS "alpha"
/* Versions-Nummer im üblichen Amiga-Format, z.B. "3.1" */
#define NB_VER NB_REL "." NB_REV
/* Standard Amiga Version-Schablone (ala full Version-String)*/
#define NB_VERSION NB_NAME " " NB_VER " (" NB_DATE ")"
/* Version-Schablone, zusätzlich mit Autor-Email-Adresse */
/* für: About-Text, "Newsreader:"-Tag */
#define NB_TAG NB_VERSION " <" NB_AUTHOR_EMAIL ">"
/* Zusammenfassung aller Version- und Zeitinfos: */
#define ALPHA_WARNING "Version: " NB_NAME " " NB_VER \
" (" NB_COMP ". Compilerlauf).\n" \
NB_DATE " " NB_TIME \
" Status: " NB_STATUS "\n"
/*-----------------------------------
Library-Base-Pointer
------------------------------------ */
/* Basisadressen der Amiga runtime link libraries */
struct Library *IntuitionBase = NULL;
struct Library *GfxBase = NULL;
struct Library *GadToolsBase = NULL;
struct Library *UtilityBase = NULL;
struct Library *IFFParseBase = NULL; /* zur Zeit nur für Textfield-Clipboards */
struct Library *UMSBase = NULL;
struct Library *DataTypesBase = NULL;
struct Library *DiskFontBase = NULL;
struct Library *UMSSupportBase = NULL;
struct Library *gLib = NULL; /* C='s G1 BOOPSI Buttongadget */
struct Library *TextLabelBase =NULL;
struct Library *ItemListBase = NULL; /* Tim's BOOPSI ListView */
struct Library *CompListViewBase = NULL;
/*--------------------------------------------------------------
Globale Variablen
--------------------------------------------------------------*/
// TODO: Werte für Focus -- wird entfallen und durch Filterstring ersetzt
// TODO1: Benutzung v. umssupport.lib
#define AlleMsg 1
#define NeueMsg 2
#define Letzte25Msg 25
LONG GlobalFocus = NeueMsg; /* Hack, todo: besseres System */
/*--------------------------------------------------*/
/* Versiontag */
static const char vers[] = "\0$VER: " NB_VERSION;
/**********************************************************************
* Textfield-Gadget *
**********************************************************************/
/*
Hinweis: Hat nichts mit den UMS-Message-Textfields zu tun! Textfield
ist hier ein BOOPSI-Gadget für mehrzeilige Texteingabe und -darstellung.
*/
/* Zeiger auf verschiedene dynamisch allozierte Buffer, todo: entfernen */
static unsigned char *text_buffer, *my_buffer;
/* Pixel-Abstand des Textfield links-rechts (_w) und oben-unten (_h), todo */
struct IBox gap = { 5,5,5,5 }; /* Dummy */
struct IBox box_group = { 5,5,5,5 }; /* Dummy */
struct IBox box_message = { 5,5,5,5 }; /* Dummy */
WORD box_h = 80;
static WORD gap_w, gap_h; /* wird obsolet */
/* Pixel-Höhe der Infozeile (Daten einer selektierten Message), Kludge. */
struct IBox infobar = { 0,0,0,0 };
static WORD infobar_h; /* wird obsolet */
/* Zwischenablage (Clipboard) Schnittstellen für das Textfield-Gadget */
static struct ClipboardHandle *clip_handle, *undo_handle;
/* Text für Programstart */
static char initial_text[] =
ALPHA_WARNING
"\n"
NB_NAME
" - Der phantastische UMS-Newsreader. "
"Autor: " NB_AUTHOR_NAME " <" NB_AUTHOR_EMAIL ">.\n"
"Updates:\n MAUS MK2 Mailbox\n 02371/944925 \n Gruppenprogrammteil MT.UMS\n";
static char help_text[] =
"Kurz-Anleitung:\n"
"-----------------------------------------------------------\n\n"
NB_NAME " -- ein Newsreader für das UMS-System.\n\n"
"\n\n"
"Menü-Referenz (alt)\n"
"-----------------------------------------------------------\n"
"Projekt\n"
" ···························\n"
" Allgemeines\n"
"\n"
"Über NewsBreaker... -- kurze Info über das Programm\n"
"Hilfe... -- Online-Hilfe, Tips und Lösungen\n"
"Ende -- NewsBreaker beenden\n"
"\n"
"\n"
"Text\n"
" ···························\n"
" Textbearbeitung\n"
"\n"
"Ausschneiden -- Textblock in Zwischenablage verschieben\n"
"Kopieren -- Textblock in Zwischenablage kopieren\n"
"Alles kopieren -- kompletten Text in Zwischenablage kopieren\n"
"Einfügen -- Inhalt der Zwischenablage einfügen\n"
"Wiederherstellen -- gelöschten Text zurückholen\n"
"Löschen -- Text im Eingabefeld löschen\n"
"\n"
"\n"
"Nachrichten\n"
" ···························\n"
" Lesen & Navigieren\n"
"\n"
"Gruppe wählen... -- Gruppe wählen\n"
"Nachricht wählen... -- Nachricht zum Lesen wählen\n"
"Nächste Nachricht -- zur nächsten Nachricht blättern\n"
"Vorherige Nachricht -- zur letzten Nachricht zurückblättern\n"
"eMails wählen -- eMails zum Lesen wählen\n"
"\n"
"\n"
"Schreiben \n"
" ···························\n"
" Texte verfassen und verschicken \n"
"\n"
"Reply -- private Antwort auf eine Nachricht\n"
"FollowUp -- öffentliche Antwort in einer Gruppe\n"
"EMail -- privates Schreiben an einen User\n"
"Posting -- öffentlicher Artikel für eine Gruppe\n"
"\n"
"\n"
"Einschränkungen\n"
" ···························\n"
" Filterfunktionen\n"
"\n"
"Alle Nachrichten -- alle vorhandenen Nachrichten anzeigen\n"
"Nur die 25 jüngsten\n"
" Nachrichten -- bis zu 25 Nachrichten einer Gruppe anzeigen\n"
"Nur neue Nachrichten-- nur noch nicht gelesene Nachrichten anzeigen\n"
"\n"
"Debug-Tools: na was wohl? :-)\n";
static char bugs_text[] =
"BUGS in " NB_TAG "\n\n"
"-----------------------------------------------------\n"
"Listen: instabil bei Einlesen großer Newsgruppen\n"
"Fenster: Refresh kann crashen.\n"
"-- \n"
"Fehlerberichte bitte an " NB_AUTHOR_EMAIL "\n"
"mit Angabe Version, benutzter Amiga-Hard/Software.\n";
static char bugreport_text[] =
";---- FEHLERBERICHT / BUG REPORT zu NEWSBREAKER ----- \n"
";WICHTIGE FRAGEN ZU DEINEM SYSTEM\n"
";\n"
"; Amiga-Typ: A.... mit AmigaOS 3.1 oder: Emuliert auf PC mit ...\n"
"; Welche CPU: 680..\n"
";Welche Extras: Turbokarte / SCSI / CD-ROM / Grafikkarte /...\n"
";Speicher Fast: ... MB \n"
";Speicher Chip: ... MB \n"
" avail full\n"
";\n"
";Benutzt Du Commodities und besondere Systemerweiterungen, Patches,\n"
";Libraries, Devices, Filesysteme?\n"
" c:list SYS:wbstartup LIBS: DEVS: L:\n"
"\n"
";FRAGEN ZU DEINER UMS-INSTALLATION\n\n"
";Versionsnummern\n"
" version UMS:Libs/ums.library\n"
" version UMS:Libs/umsserver\n"
";\n"
";Installierte Messagebase(s)\n"
" c:list >t:out ENV:UMSMB.#? lformat=\"echo %n*ngetenv %n\"\n"
" c:execute t:out\n"
";\n"
";UMS-Konfiguration(en)\n"
";\n"
";FEHLERBESCHREIBUNG Nr. 1\n"
";Diese Schritte führten bei mir zum Fehler: \n"
";1. \n"
";2. \n"
";3. \n"
";Ergebnis: Crash/Fehlermeldung/Falsche Reaktion/...\n"
";\n\n"
";FEHLERBESCHREIBUNG Nr. ..\n"
";1. \n"
";2. \n"
";3. \n"
";Ergebnis: Crash/Fehlermeldung/Falsche Reaktion/...\n"
";\n\n";
static char orderform_text[] =
"BESTELLSCHEIN für " NB_NAME "\n"
"\n"
"An:\n "
NB_AUTHOR_NAME "\n"
NB_AUTHOR_EMAIL "\n\n"
"\n"
"Bitte schick mir die neueste " NB_NAME " Version\n"
"- mit gedruckter Anleitung\n"
"- per Post, frei Haus.\n"
"\n"
"Meine Lieferadresse:\n\n"
"(NAME, STRASSE, PLZ,WOHNORT, LAND)\n"
"\n\n"
"\n\n\n\n"
"Versandtermin: (__) umgehend (__) erst ab .../.../19..(Datum)\n"
"\n"
"Für den Versand habe ich \n"
"- diesem Brief DM ___ gut verpackt beigelegt\n"
" oder\n"
"- auf das Konto Nr. 9 522 152 bei der Sparkasse Schwerte,\n"
" Bankleitzahl 441 524 90, Inhaber: " NB_AUTHOR_NAME " am \n"
" .../.../19.. (Datum) den Betrag von DM ___ überwiesen.\n"
"\n"
"Meine E-Mail-Adresse: \n"
"\n"
"Bemerkungen/Versandhinweise:\n"
"\n\n";
static char featurewish_text[] =
"WUNSCHZETTEL für " NB_NAME "ERWEITERUNGEN\n"
"\n"
"An:\n "
NB_AUTHOR_NAME "\n"
NB_AUTHOR_EMAIL "\n\n"
"Hallo,\n\n"
"ich benutze " NB_VERSION ".\n\n"
"Diese Erweiterungen wünsche ich mir für die nächste \n"
"Version:\n\n"
"1. -- \n"
"2. --\n"
"3. --\n"
".. \n"
"Hier meine E-Mail-Adresse für Rückfragen:\n\n"
"\nErgänzungen/Bemerkungen:\n"
"\n\n";
/*-----------------------------------------------------------
BOOPSI Listview
-----------------------------------------------------------*/
/*
LISTVIEWS:
Variabeln für das BOOPSI ListView von Tim Stack. Visit his Website!
Er hat ca. 20 BOOPSI Objekte online, als Exe und komplett mit Source.
WWW: (Stand November 1996)
----
http://www.cs.utah.edu/~stack/boopsi.html
Tims BOOPSI-Hauptseite mit Links auf:
- http://www.cs.utah.edu/~stack/classsrc.lha
Sehr großes (> 1.000 K!) Archiv mit allen Classes und Sourcen
Aktuelle Dateien sind nicht im Archiv, sondern in dem Classes/ dir.
- http://www.cs.utah.edu/~stack/makealias.iff
ein Hilfsprogramm.
- http://www.cs.utah.edu/~stack/classes
Oberdirectory von Tims Sourcen
(wie in <classsrc.lha>, hier können gezielt Einzelfiles geladen werden)
- Classes/itemlist/demo.c ---- idcmp loop demo
Frage: wie kommt man an das Verzeichnis einer Web-URL???
AMINET: (Stand November 1996)
-------
ListViewClass.lha dev/gui 60K 1+BOOPSI listview gadget with source
-- das ist eine ältere Version (August 1996) von Tims ListView Gadget und
ListViewItems
EMAIL: (Stand November 1996)
------
Tim Stack <stack@eng.utah.edu>
*/
/* Drei Listviews, ein Gruppen-, ein "Thread-", ein Nachrichten-ListView. */
/* Gadget IDs */
#define LV_GROUP 20
#define LV_MESSAGE 40
#define LV_THREAD 60
struct Gadget *gad_group, *gad_message, *gad_thread; /* BOOPSI Object Pointer */
//struct Gadget *prop_group, *prop_message; /* Scroller Gadget */
/**********************************************************************
* Intuition *
**********************************************************************/
struct Window *Mywindow = NULL;
struct Gadget *txtfld, *prop_object, *up_object, *down_object;
struct Image *up_image, *down_image;
/* Hauptfenster */
ULONG window_sig, sigs; /* Exec Signale */
struct IntuiMessage *msg; /* Zeigt auf IMessage, verwendet in Mainloop */
struct IntuiMessage myMsg; /* gepufferte Felder aus msg */
struct DrawInfo *dri = NULL; /* Struktur für einheitliche Layouts */
UWORD *pens; /* Pen-Array (aus DrawInfo) */
APTR *visual_info = NULL; /* Hilfsstruktur für Gadtools-Gadgets */
struct Menu *strip; /* Menustruktur, wird über Gadtools-Supportfunktion erzeugt */
/*------------------- Puffer -------------------------------- */
static char myWindowTitle[101] = "";
#define MYBUFFERSIZE 255
static char myBuffer[MYBUFFERSIZE] = ""; /* ein globaler Stringpuffer */
/*------------------------- BOOPSI -------------------------- */
/* Textfield BOOPSI-Mapping von Attributen */
/* Prop-Gadget */
static struct TagItem prop2text[] =
{
{PGA_Top, TEXTFIELD_Top},
{TAG_DONE}
};
/* Textfield-Gadget */
static struct TagItem text2prop[] =
{
{TEXTFIELD_Top, PGA_Top},
{TEXTFIELD_Visible, PGA_Visible},
{TEXTFIELD_Lines, PGA_Total},
{TAG_DONE}
};
/* Up-Button */
static struct TagItem up2text[] =
{
{GA_ID, TEXTFIELD_Up},
{TAG_DONE}
};
/* Down-Button */
static struct TagItem down2text[] =
{
{GA_ID, TEXTFIELD_Down},
{TAG_DONE}
};
/*-------------------- BOOPSI Listview --------------------*/
struct ItDim /* Item Abmessungen */
{
WORD Width;
WORD Height;
};
struct ItOff /* Item Offset */
{
WORD X;
WORD Y;
};
struct TagItem il2int1[] =
{
{ILGA_Top, STRINGA_LongVal},
{TAG_DONE,}
};
struct TagItem il2int2[] =
{
{ILGA_Selected, STRINGA_LongVal},
{TAG_DONE,}
};
struct TagItem il2prop[] =
{
{ILGA_Top, PGA_Top},
{ILGA_Total, PGA_Total},
{ILGA_Visible, PGA_Visible},
{TAG_DONE,}
};
struct TagItem ic12prop[] =
{
{ILGA_Selected, PGA_Top},
{ILGA_Total, PGA_Total},
{TAG_DONE,}
};
struct TagItem ic22prop2[] =
{
{ILGA_Top, PGA_Top},
{ILGA_Visible, PGA_Visible},
{ILGA_Total, PGA_Total},
{TAG_DONE,}
};
struct TagItem prop2il[] =
{
{PGA_Top, ILGA_Selected},
{TAG_DONE,}
};
struct TagItem prop22il[] =
{
{PGA_Top, ILGA_Top},
{TAG_DONE,}
};
struct TagItem ic12il[] =
{
{PGA_Top, ILGA_Selected},
{TAG_DONE,}
};
struct TagItem ic22il[] =
{
{PGA_Top, ILGA_Top},
{TAG_DONE,}
};
/*************************************************************************
* UMS *
*************************************************************************/
/* Zeiger auf Commandline-Argumente */
/*
* Für ein erfolgreiches LOGIN benötigt UMS:
*
* ---muß---
* user -- UMS-Username, z.B. "Stefan Müller", "sysop", ...
* passwd -- Paßwort, z.B. "sesam", (oder "%", für "kein Paßwort")
*
* ---kann---
* server -- UMS-Server, wird meist nicht angegeben. "default" für
* den Standardserver, "<andererServer>" für einen Fremdserver.
* Ein in der Regel bei Einplatz-System unbenutztes UMS-Feature.
* Forget it.
*
* Selbstverständlich muß der User & sein Paßwort bereits für
* UMS konfiguriert sein. Das sieht in der Regel so aus:
*
<ums.config>
( Sysop --- ich bin Sysop-"User"
( Alias --- man kennt mich auch als: root, postmaster, ...
root
postmaster
sysop
Stefan
"Stefan Mueller"
"Stefan_Müller"
)
( READACCESS "#?" ) --- ich kann alle Gruppen lesen
( WRITEACCESS "#?" ) --- ich kann in alle Gruppen schreiben
( NETACCESS "#?" ) --- ich habe uneingeschränkten Netzzugang
( IMPORT % ) --- ich kann nichts importieren (das macht der Importer)
( Name "Stefan Müller" ) --- mein persönlicher Name (realname)
( Password ) --- mein Paßwort. Da ich keins habe: kein Eintrag.
)
*
* Fehlt der Usereintrag, oder gibt es Fehler beim Login, bricht
* NewsBreaker sofort ab. (todo: Abbruch erst bei Cancel)
*
*/
STRPTR user = NULL; /* UMS-Username */
STRPTR passwd = NULL; /* geheimes Paßwort */
STRPTR server = NULL; /* (optionaler) UMS-Server */
/* Account, globaler Handle für alle UMS-Funktionen */
/* wird nach erfolgreichem Login gesetzt, und nach Logout
* werden alle UMS-Puffer für den account freigegeben.
*/
UMSUserAccount account = NULL; /* globaler Handle */
/* ===================================================
* MessageInfo
* ===================================================
*
* Was ist MessageInfo?
* --------------------
* Eine wichtige Struktur in <ums.h>:
*
* struct MessageInfo {
* LONG msgi_HeaderLength;
* LONG msgi_TextLength;
* LONG msgi_Date;
* UMSMsgNum msgi_ChainUp;
* UMSMsgNum msgi_ChainDn;
* UMSMsgNum msgi_ChainLt;
* UMSMsgNum msgi_ChainRt;
* UMSSet msgi_GlobalStatus;
* UMSSet msgi_UserStatus;
* UMSSet msgi_LoginStatus;
* UMSMsgNum msgi_HardLink;
* UMSMsgNum msgi_SoftLink;
* [V11 extension, only filled by UMSTAG_RExtMsgInfo:]
* LONG msgi_CDate;
* LONG msgi_Reserved[3];
* };
*
* MessageInfo kann für jede Message mit UMSReadMsg ausgefüllt
* werden. Vorteile: ein Aufruf von UMSReadMsg(), ein Platz für
* die Struktur reicht, um alle wichtigen Daten der Message ab-
* zulegen, auszulesen.
*
* Was liefert MessageInfo nicht?
* ------------------------------
* MessageInfo liefert keine Zeiger auf Texte, Adressen,
* Titel usw.
*
* Dafür gibt es UMSMsgTextFields[UMSNUMFIELDS].
* Siehe <ums.h> für die Definition der einzelnen Feld-Indices.
*
* [ ]
*
* #define UMSCODE_MsgText 0
* #define UMSCODE_FromName 1
* #define UMSCODE_FromAddr 2
* #define UMSCODE_ToName 3
* #define UMSCODE_ToAddr 4
* ...
*
*
* printf ( "FromName: %s", myTextFields [ UMSCODE_FromName ] );
*
* ergibt:
*
* FromName: Hans Hase
*
* wenn vorab ein
* UMSMsgTextFields myTextFields
* mit
* UMSReadMsg() erfolgreich ausgefüllt wurde:
*
* immer testen, ob Lesen erfolgreich war:
*
* if (!UMSReadMsg(account,tags,...)) { Fehler!} else { OK! }
*
* Mehr über die MessageInfo-Struktur
* ----------------------------------
* Alle Werte in der Struktur sind für genau eine Nachricht
* gültig. Für jede Message müssen die Werte neu eingelesen werden.
*
* Wichtig:
* Die tatsächlichen Werte einer Message können sich jederzeit
* ändern. Angaben in MessageInfo sind nicht ewig gültig. Nur
* im Abruf-Zeitpunkt ist das einigermaßen sicher. Denn:
*
* Parallel laufende externe UMS-Programme (Exporter, Importer,
* Laberfilter, Newsreader) können leicht Daten einer Message abändern.
* Die historischen Angaben in MessageInfo sind dann veraltet.
* Aktuelle Werte der Message erfährt man nicht aus alten MessageInfos.
* Don't trust MessageInfo!
*
*
* Wie kommen UMS-Daten in MessageInfo?
* ------------------------------------
*
* Mit
* [ungetestet]
* {
* UMSMsgNum MessageNummer
* struct MessageInfo MInfo,
*
* success = UMSReadMsgTags(account,
* UMSTAG_RMsgInfo, (ULONG) &MInfo,
* UMSTAG_RMsgNum, MessageNummer,
* TAG_DONE
* );
*
*
*
* Welche Daten sind in MessageInfo verfügbar?
* -------------------------------------------
* - HeaderLength, TextLength, Date, ChainUp, ChainDn,
* ChainLt, ChainRt, GlobalStatus, UserStatus, LoginStatus, HardLink,
* SoftLink.
* - Unter UMS V11 zusätzlich CDate. Ein spezieller Tag muß beim
* Einlesen gesetzt werden.
* (siehe unten)
* - Darüber hinaus gibt es spezielle Daten. Nur mit UMSReadMsg() abrufbar.
* Siehe <ums.h>.
*
* Wann ist MessageInfo zu umständlich?
* ------------------------------------
* Wer nur wenige Daten aus dieser Liste braucht, ist mit
*
* LONG Info;
* success = UMSReadMsgTags(account, UMSTAG_R......., &Info);
*
* besser bedient. Der Overhead einer kompletten MessageInfo-Struktur
* wird vermieden. Es wird nur Platz für die benötigten Felder
* vergeben. Wenn z.B. NUR globale Flags gelesen werden, reicht
* ein UMSSet myGlobalFlags, ein ReadMsg() mit entsprechendem
* Tag und & myGlobalFlags. Dann wird myGlobalFlags mit der passenden
* Info für Message Nummer x gefüllt. Auch hier wieder: Testen
* auf Fehler bei ReadMsg.
*
* Beispiel [ungetestet]
*
* Aufgabe: Gegeben ist die MsgNum 10. Ermittle die
* übergeordnete Nachricht von Msg 10.
*
* vorab: ums.lib öffnen, einloggen mit account = UMSRLogin()
* {
* UMSMsgNum MeineMessage = 10;
* UMSMsgNum Ursprungsnachricht = NULL;
*
* if (! UMSReadMsgTags(account,
* UMSTAG_RMsgNum, (LONG) MeineMessage,
* UMSTAG_RChainUp, (LONG) &Ursprungsnachricht,
* TAG_DONE)
* ) printf("FEHLER bei ReadMsg()")
* else
* {
* if (Ursprungsnachricht)
* printf ("Ursprungsnachricht meiner Message %ld ist Message %ld\n",
* MeineMessage, Ursprungsnachricht);
* else
* printf ("Eine übergeordnete Nachricht zu %ld wurde nicht gefunden!\n",
* MeineMessage);
* }
* }
* ausloggen,
* ums.library schließen
*
* Beispiel Ende.
*
*
* Erweiterungen in V 11?
* -----------------------
* Unter UMS Version 11 gibts mit UMSTAG_RExtMsgInfo
* das Feld "msgi_CDate" sowie drei reservierte Langworte als
* LONG msgi_Reserved[3];
*
* UMSReadMsgTags(account,
* UMSTAG_RMsgNum, (LONG) MeineMessage,
* UMSTAG_RExtMsgInfo, TRUE,
* UMSTAG_RMsgInfo, (LONG *) myMessageInfo,
* TAG_DONE);
*
*
* MESSAGE INFO - FELDER IM DETAIL
* ===============================
* Feldinhalte und mögliche Werte aufgelistet und beschrieben.
*
* Wie lang ist der Text?
* ----------------------
* LONG HeaderLength -- Länge des Message-Headers in bytes
* LONG TextLength -- Länge des Message-Textes in bytes
*
* Wie alt ist die Nachricht?
* --------------------------
* LONG Date -- (obsolet) Datum der Message:
* LONG CDate -- nur mit UMS V11 und Extension-Tag
*
* Verknüpfungen zu anderen Nachrichten?
* -------------------------------------
* UMSMsgNum ChainUp -- Ursprungsnachricht
* UMSMsgNum ChainDn -- gibt es "unter mir" angehängte Nachrichten?
* UMSMsgNum ChainLt -- weitere Nachrichten, die sich auch auf
* UMSMsgNum ChainRt -- die Ursprungsnachricht beziehen
*
*
* Die Stati dieser Nachricht
* --------------------------
* Hinweis:
* 1. Der Typ UMSSet ist vom Typ LONGBITS. Das sind 32 Bits. Unter UMS
* stehen dem Programmierer _nur die 16 unteren Bits_ zur Verfügung.
* Die 16 oberen Bits (Bit 16 bis 31) sind zur Zeit tabu.
*
* 2. Es gibt drei Gruppen von Statusangaben. Es ist wichtig,
* den richtigen Status zum Schreiben und zum Lesen auszuwählen!
*
* a) GlobalStatus - nur einen GlobalStatus für jede Message
* b) UserStatus - pro User und Message: ein UserStatus
* c) Login/LocalStatus - pro Login, User und Message: ein LoginStatus
*
* Beispiele:
* Messagebase mit 10 Messages, zwei Usern, fünf UMS-Programmen.
*
* MB Msg# 1 2 3 4 5 6 7 8 9 10
* a) GlobalStatus g g g g g g g g g g UMS-Messagebase-Processor
* b) UserStatus1 u u u u u u u u u u User 1
* UserStatus2 v v v v v v v v v v User 2
* c) Login User1 l l l l l l l l l l IntuiNews User1
* Login User1 l l l l l l l l l l Sumsset User1
* Login User2 l l l l l l l l l l NewsBreaker User2
* Login User2 l l l l l l l l l l IntuiNews User2
* Login User2 l l l l l l l l l l TopTen User2
*
* In diesem Beispiel hat eine Message einen GlobalStatus (+1),
* zwei UserStatus (+2 = 3), fünf LoginStatus (+5 = 8).
*
* Zu den Status-Flags
* ===================
*
* UMSSet GlobalStatus -- Deleted Expired Exported Orphan Link HardLink
* Parked HasFile und (Protected)
* --------------------------------------------------------------------------
* HINWEIS: VIELE FLAGS SIND "PRIVATE". Siehe Protected in ums.h.
*
* Deleted - als Gelöscht markiert.
* Expired - zum Löschen freigegeben beim nächsten Aufräumen der Messagebase
* mit UMSServerControl()
* Exported - die Nachricht wurde von einem UMS-Exporter erfolgreich versandt.
* Orphan - Exportieren ist fehlgeschlagen?
* Link - ? Soft-Verknüpfung für Crosspostings?
* HardLink - Verknüpfung für Crosspostings??
* Parked - der User will die Nachricht erst später versenden. Bis dahin
* ist die Nachricht geparkt. Exportieren nicht erlaubt.
* HasFile - zu der Nachricht gehört eine Datei. Der Dateiname ist mit
* UMSCODE_FileName aus einem UMSMsgTextFields[] zu ermitteln,
* oder alternativ mit Tag UMSTAG_RFileName in einem UMSReadMsgTags()
* Aufruf.
*
*
*
* UMSSet UserStatus -- Archive Junk PostPoned Selected Filtered Old
* WriteAccess ReadAccess ViewAccess Owner
* und (Protected)
* --------------------------------------------------------------------------
*
* Archive - die Nachricht soll etwas länger in der Messagebase bleiben
* Junk - auf Deutsch Müll. Unter ums: ???
* PostPoned - ?
* Selected - die Nachricht wurde "ausgewählt", z.B. von einem Filtertool.
* Newsreader können Selected-Nachrichten gezielt darstellen.(?)
* Filtered - die Nachricht wurde "gefiltert", z.B. von einem Filtertool.
* Newsreader können Selected-Nachrichten gezielt verbergen.(?)
* Old - der User kennt diese Nachricht schon, sie ist "alt".
* Ist Old nicht gesetzt, dann ist die Nachricht "neu".
*
* - Verschiedene Zugriffsrechte Deines UMSAccounts. Abhängig
* von der UMS-Konfiguration für den User:
* WriteAccess - ich darf diese Nachricht überSchreiben
* ReadAccess - ich darf diese Nachricht und ihre Header lesen
* ViewAccess - ich kann diese Nachricht "sehen" (sie ist nicht "versteckt")
* Owner - diese Message gehört mir. Ich kann sie ändern, löschen usw.
* (Protected) - die Flags WriteAccess, ReadAccess, ViewAccess, Owner zusammen-
* geORt. When writing global- or user-flags, you are not allowed to
* manipulate all possible flags. Protected Flags sind PRIVATE!
*
*
* UMSSet LoginStatus -- 16 Bits (von Bit 0 bis Bit 15) zu Deiner freien
* Verfügung. Werden im ums.doc auch als Local-Flags
* bezeichnet. Bedeutet aber das gleiche wie Login.
*
* Diese LoginFlags kommen bei
* UMSSelect() und UMSSearch() zur Anwendung.
* Vor Gebrauch: mit UMSSelect zurücksetzen.
* --------------------------------------------------------------------------
* Ende StatusFlags. Weiter mit restlichen MessageInfo-Feldern:
*
* Für Crosspostings
* -----------------
* UMSMsgNum HardLink
* UMSMsgNum SoftLink
*
*/
struct MessageInfo myMessageInfo;
/* ==================================================
* UMSMsgTextFields
* ==================================================
* Globaler Zeiger auf Messagefields. Siehe ums.h für die vorgesehenen
* Feldinhalte. Beispiel: myFields[0] zeigt auf den Message-Body.
* Wobei die Zahl "0" für UMSCODE_MsgText steht. Zweites Bespiel: Mit
* myFields[ UMSCODE_FromName ] kommt man an den Absendernamen usw.
*
* Nullzeiger:
* Wenn myFields [ UMSCODE_............ ] = NULL, ist der
* Eintrag entweder nicht eingelesen, nicht verfügbar oder
* es gab einen Fehler beim Lesen.
*
* 3. Beispiel:
*
* printf("Diese Message kommt von: %s .\n", myFields[ UMSCODE_FromName ] ?
* myFields[ UMSCODE_FromName ] : "-- kein Name vorhanden!\n" );
*
* ergibt:
* "Diese Message kommt von: Stefan Müller"
*
* oder:
* "Diese Message kommt von: -- kein Name vorhanden!"
*
* Es gibt insgesamt über 40 dieser UMSCODE-message array index definitions
* (siehe "ums.doc/--message-format--" und das Includefile ums.h.)
*
* Warnung:
* Die mit UMSReadMsg() gelesenen Daten müssen nach Gebrauch wieder
* freigegeben werden (1 x UMSFreeMsg() ). Die Feldinhalte sind READ-ONLY.
* Verboten: überschreiben, ändern.
* (todo)
*/
UMSMsgTextFields myFields;
/* Zeiger auf Users Realname. Wird nach UMSRLogin() aus der UMS-Konfiguration gelesen. */
/* todo: checken ob FreeConfig? */
STRPTR realname;
/* --------- List-Kludges ------------- */
/*
* MyNodes -- (vorläufiger) Listnode für die Message- und Gruppenlisten
*
* struct Node node -- Standard-Exec-ListNode mit Name, Pri und Type
* UMSMsgNum num -- Speicher für die Messagenummer (für GlobMsgList)
* STRPTR text -- Speicher für Eintrag in Listview (MyNodes.node.ln_Name =UMS-Intern) (todo)
*/
struct MyNodes
{
struct Node node; // Eine Node-Struktur
UMSMsgNum num;
STRPTR text; /* interner Text */
};
/* Typ name_nodes... */
#define NAME_NODE 200
/* Messagedaten in Newsbreaker.
* ============================
*
* Leider wird von ums.library etc. kein allgemeines Format angeboten,
* in dem Applikationen Nachrichten- und Gruppenlisten speichern
* und verwalten können.
*
* Deshalb hier die (vorläufige) Implementierung der Message- und
* Gruppenverwaltung in NewsBreaker:
*
* Zur Zeit werden hier UMS-Messages in zwei unterschiedlichen Exec-Lists
* gespeichert:
*
* 1. in einer globalen GRUPPEN-Liste
* 2. in einer globalen MESSAGE- oder Nachrichten-Liste
*
* Dazu:
*
* 1. (List *) GlobGroupList
*
* verwaltet eine Liste der zugänglichen Gruppen. Die Globale
* Gruppen Liste wird mit MakeGroupList() erzeugt. [ Zur Zeit
* wird hier noch über die globale Variable "GlobalFocus" gefiltert,
* ob alle vorhandenen Gruppen oder nur Gruppen mit neuen
* Nachrichten in die Liste aufgenommen werden (kludge) ].
*
* Ein Node der GlobGroupList enthält (zur Zeit) im ln_Name-Feld einen
* STRPTR auf den Gruppennamen. Diese Info wird in anderen
* Routinen (z.B. Gadtools ListView-Handling) ausgelesen.
*
* [ Hinweis: Es ist schon in der Nodestruktur (siehe Globals.h)
* ein weiteres STRPTR-Feld vorbereitet um zwischen internem UMS-Gruppenname
* und ListView-Darstellung der Gruppe zu unterscheiden. -todo.]
*
*
* 2. (List *) GlobMsgList
*
* verwaltet eine Liste der wählbaren Messages. Die Globale Message
* Liste wird mit MakeMsgList() erzeugt. Hier wird der "Focus", also
* die Beschränkung auf bestimmte Nachrichten (alle neuen, alle, ...)
* schon im Aufruf von MakeMsgList () übergeben.
*
* Ein Node der GlobMsgList enthält neben einem STRPTR für die ListView-
* Darstellung die (eindeutige) UMS-Message-Nummer. Diese UMS-Message-Nummer
* wird aus dem Node ausgelesen:
* wenn User in einem ListView den entsprechenden Eintrag anklickt.
*
* Allgemeines zu den globalen Listen:
*
* - Dieses Konzept wird weiter optimiert. Siehe auch die Kommentare
* in den Funktionen.
* - GlobGroupList und GlobMsgList werden über die Funktionen
* in <Lists.c> verwaltet. Hier sollten noch speziellere Fallunter-
* scheidungen getroffen werden (todo)
* - Hinweis: Zu beiden globalen Listen gehören weitere globale Variablen.
* Diese werden unten behandelt.
*/
struct List *GlobGroupList = NULL; /* Pointer auf globalen Listheader */
struct List *GlobMsgList = NULL; /* Pointer auf globalen Listheader */
/* GlobMsgGroup : wenn nicht NULL, dann ist STRPTR der Name einer Gruppe.
Diese Gruppe ist mit GlobMsgList verbunden. AktMsgGroup kann gleich
GlobMsgGroup sein, muß aber nicht. */
STRPTR GlobMsgGroup = NULL; /* Message-Liste hat Nodes aus Gruppe "GlobMsgGroup" */
STRPTR AktMsgGroup = NULL; /* User wählt Gruppe AktMsgGroup */
UMSMsgNum GlobMsgNum = 0; /* Globale MsgNum in NewsBreaker */
UMSMsgNum tempNum = 0; /* temporäre Messagenummer für einige Routinen (kludge) */
/*----------------------------------------------------------*/
/* Ich versuche, globale Variablen in einer Struktur zusammenzufassen: */
/* Dies ist z.Zt. nicht implementiert: */
struct NBInfo /*todo */
{
struct Gadget *txt;
struct Window *win;
UMSUserAccount acc;
};
/*----------------------------------------------------*/
/* WriteMsg */
/* Messagetypen für WriteMsg(): *//* todo --> globals.h */
enum
{
EMAIL, POSTING, REPLY, FOLLOWUP
};
/* dazu passende Strings... */
STRPTR msgtypename[] = { "EMail", "Posting", "Reply", "FollowUp" };
STRPTR msgtypeaction[] =
{
"Private E-Mail schreiben",
"Öffentliches Posting schreiben",
"Reply auf Nachricht schreiben",
"FollowUp auf Nachricht schreiben"
};
/*******/
/* DBG */
/*******/
/* ShowGlobals Level-Parameter */
#define SG_FULL 0L /* alles zeigen */
#define SG_SHORT 1L /* nur das Wichtigste */
#define SG_MEMORY 2L /* nur Speicher */
#define SG_UMS 3L /* nur UMS */
/*--------------------------*/
/* todo: global und lokal */
/* Bezeichnung der UMS_Fields */
static char *ums_field[] =
{
"MsgText", // 0
"FromName", // 1
"FromAddr", // 2
"ToName", // 3
"ToAddr", // 4
"MsgID", // 5
"CreationDate", // 6
"ReceiveDate", // 7
"ReferID", // 8
"Group", // 9
"Subject", //10
"Attributes", //11
"Comments", //12
"Organization", //13
"Distribution", //14
"Folder", //15
"FidoID", //16
"MausID", //17
"ReplyGroup", //18
"ReplyName", //19
"ReplyAddr", //20
"LogicalToName", //21
"LogicalToAddr", //22
"FileName", //23
"RFCMsgNum", //24
"?", //25
"?", //26
"?", //27
"?", //28
"?", //29
"?", //30
"?", //31
"FidoText", //32
"ErrorText", //33
"Newsreader", //34
"RfcAttribut", //35
"FtnAttribut", //36
"ZerAttribut", //37
"MausAttribut", //38
"?", //39
"?"};
static char *ums_messageinfos[] =
{
"HeaderLength",
"TextLength",
"Date",
"ChainUp",
"ChainDn",
"ChainLt",
"ChainRt",
"GlobalStatus",
"UserStatus",
"LoginStatus",
"HardLink",
"SoftLink",
"CDate"};
/* Global Flag Names */
static char *ums_globalflags[] =
{
"Deleted ",
"Expired ",
"Exported ",
"Orphan ",
"Link ",
"Hardlink ",
"Parked ",
"HasFile "};
/* User Flag Names */
static char *ums_userflags[] =
{
"Archive ",
"Junk ",
"PostPoned ",
"Selected ",
"Filtered ",
"Old ",
"WriteAccess ",
"ReadAccess ",
"ViewAccess ",
"Owner "};